]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
panel: Set up 'open-state-changed' handler on menu changes
authorFlorian Müllner <fmuellner@gnome.org>
Tue, 28 Apr 2015 09:05:58 +0000 (11:05 +0200)
committerFlorian Müllner <fmuellner@gnome.org>
Thu, 30 Apr 2015 16:12:52 +0000 (18:12 +0200)
Commit 08690d658f42 generalized the banner-blocking behavior of the
dateMenu to all menus that would obscure the banner. However setting
up the 'open-state-changed' handler only when an indicator is added
does not work for indicators that change their entire menu (like the
app menu) - we currently end up with menus with no connected signal
handler, and throw an error when trying to disconnect an invalid
signal ID.
To address this, add a new PanelButton::menu-set signal and use that
to set up the 'open-state-changed' handler.

https://bugzilla.gnome.org/show_bug.cgi?id=745910

js/ui/panel.js
js/ui/panelMenu.js

index 46be6acca0e490e0f97c5ce0143177f276263093..77f44c8ac7cff8fedf1219d17ecd067e7425ee43 100644 (file)
@@ -1003,24 +1003,6 @@ const Panel = new Lang.Class({
         if (parent)
             parent.remove_actor(container);
 
-        if (indicator._openChangedId > 0)
-            indicator.menu.disconnect(indicator._openChangedId);
-        indicator._openChangedId = 0;
-
-        if (indicator.menu)
-            indicator._openChangedId = indicator.menu.connect('open-state-changed',
-                Lang.bind(this, function(menu, isOpen) {
-                    let boxAlignment;
-                    if (box == this._leftBox)
-                        boxAlignment = Clutter.ActorAlign.START;
-                    else if (box == this._centerBox)
-                        boxAlignment = Clutter.ActorAlign.CENTER;
-                    else if (box == this._rightBox)
-                        boxAlignment = Clutter.ActorAlign.END;
-
-                    if (boxAlignment == Main.messageTray.bannerAlignment)
-                        Main.messageTray.bannerBlocked = isOpen;
-                }));
 
         box.insert_child_at_index(container, position);
         if (indicator.menu)
@@ -1031,6 +1013,8 @@ const Panel = new Lang.Class({
             emitter.disconnect(destroyId);
             container.destroy();
         }));
+        indicator.connect('menu-set', Lang.bind(this, this._onMenuSet));
+        this._onMenuSet(indicator);
     },
 
     addToStatusArea: function(role, indicator, position, box) {
@@ -1062,5 +1046,24 @@ const Panel = new Lang.Class({
         this.actor.remove_style_class_name(className);
         this._rightCorner.actor.remove_style_class_name(className);
         this._leftCorner.actor.remove_style_class_name(className);
+    },
+
+    _onMenuSet: function(indicator) {
+        if (!indicator.menu || indicator.menu._openChangedId > 0)
+            return;
+
+        indicator.menu._openChangedId = indicator.menu.connect('open-state-changed',
+            Lang.bind(this, function(menu, isOpen) {
+                let boxAlignment;
+                if (this._leftBox.contains(indicator.container))
+                    boxAlignment = Clutter.ActorAlign.START;
+                else if (this._centerBox.contains(indicator.container))
+                    boxAlignment = Clutter.ActorAlign.CENTER;
+                else if (this._rightBox.contains(indicator.container))
+                    boxAlignment = Clutter.ActorAlign.END;
+
+                if (boxAlignment == Main.messageTray.bannerAlignment)
+                    Main.messageTray.bannerBlocked = isOpen;
+            }));
     }
 });
index 092ca233a6b3d5e50d21fd497ddc239476df3a35..d427ab5ffad07e0742343fe49ef9f8e3ea343c54 100644 (file)
@@ -128,6 +128,7 @@ const Button = new Lang.Class({
             Main.uiGroup.add_actor(this.menu.actor);
             this.menu.actor.hide();
         }
+        this.emit('menu-set');
     },
 
     _onEvent: function(actor, event) {